package k4_thread.demo09;

/**
 * 假设一个银行的ATM机，它可以允许用户存款也可以取款。
 * 现在一个账户上有存款200元，用户A和用户B都拥有在这个账户上存款和取款的权利。
 * 用户A将存入100元，而用户B将取出50元，那么最后账户的存款应是250元。实际操作过程如下
 *
 * (1) 先进行A的存款操作：
 * 		1)	得到账户的存款数额200，耗时2s。
 * 		2)	将账户数额增加100，耗时忽略不计
 * 		3)	将新生成的账户结果300返回到ATM机的服务器上，耗时2s
 * (2) 再进行B的取款操作：
 * 		4)	得到增加后账户存款数额300，耗时2s。
 * 		5)	判断取款额是否小于账户余额，若是，则将账户数额减少50，否则抛出异常信息，耗时忽略不计。
 * 		6)	将新生成的账户结果250返回到ATM机的服务器上，耗时2s。
 * 	请根据以上要求，将A的操作和B的操作分别用线程来表示,编写一个Java程序实现该功能
 */
public class ATM {

    private static Account account;

    public ATM(Account account) {
        this.account = account;
    }

    /**
     * 显示目前账户的余额
     */
    public synchronized static void showMoney(){
        try {
            //耗时2秒后返回余额
            Thread.sleep(2000);
            System.out.println("余额为："+account.getMoney());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 存款
     * @param money
     */
    public synchronized static void saveMoney(double money){
        account.setMoney(account.getMoney()+money);
        System.out.println("成功存入 "+money);
    }

    /**
     * 取款
     * @param money
     */
    public synchronized static void takeMoney(double money){
        if(money<account.getMoney()){
            account.setMoney(account.getMoney()-money);
            System.out.println("成功取出 "+money);
        }else{
            throw new MoneyEmptyException("余额不足");
        }
    }

}


